package src.A_JavaBase;

// String，StringBuffer 和 StringBuilder
public class Oop07_String {
    public static void main(String[] args) {
        /*
            String ：是字符常量，值不可改变，适用于少量拼接的情况
            StringBuffer：可变，多线程安全的，适用多线程下在字符缓冲区进行大量操作的情况
            StringBuilder：可变，多线程不安全的，适用于单线程下在字符缓冲区进行大量操作的情况
            StringBuffer 和 StringBuilder 的相同点：
                1、都是可变的字符串对象；2、底层都有个char数组（每次字符串改变都是改变这个数组，而不会重新创建对象）
            StringBuffer 和 StringBuilder 的不相同点：
                StringBuffer是线程安全的底层加了锁适用于多线程，StringBuilder是线程不安全的适用于单线程
        */

        // String 对象的值是不可改变的, 会产生问题,经常拼接字符串时,会创建多个字符串对象,造成浪费
        String str = "aaa";
        System.out.println(str+="ss");

        StringBuffer s = new StringBuffer("abcd"); //容量为：4+16 = 20（底层默认数组长度为16）
        s.append("efg"); //在末尾添加字符串,并没有创建新的StringBuffer对象和底层数组
        s.append("efg");
        s.append("efg");
        s.append("efg");//当底层数组容量不够时,会创建一个新的数组对象赋给value数组，但是StringBuffer对象没有变。换了底层的数组，没有换对象
        s.insert(1, "XX");//在指定的位置上插入字符串
        //s.deleteCharAt(1);
        //System.out.println(s);
        //s.delete(1,5); //删除指定区间的字符串，包含开始不包含结尾
        //s.replace(2,5,"AA");//替换字符串
        //s.reverse();//反转字符串
        System.out.println(s);
        String s1  = s.substring(2,8);//截取时,返回一个新的字符串,原字符串不变
        System.out.println(s1);
    }
}
